package cn.com.bluemoon.daps.standard.service;

import cn.com.bluemoon.daps.common.constant.DapConstant;
import cn.com.bluemoon.daps.common.domain.ResultBean;
import cn.com.bluemoon.daps.common.domain.UserInfoHolder;
import cn.com.bluemoon.daps.common.enums.StandardAuditStatus;
import cn.com.bluemoon.daps.standard.entity.BasePublishInfoOfStandard;
import cn.com.bluemoon.daps.standard.entity.DapStandardAuditVersionMain;
import cn.com.bluemoon.daps.standard.entity.DapStandardIndex;
import cn.com.bluemoon.daps.standard.vo.BasicStandardAndDicVo;
import cn.com.bluemoon.daps.standard.vo.StandardDataModifyVo;
import cn.com.bluemoon.daps.standard.vo.StandardListSearchVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;
import java.io.InputStream;
import java.util.Optional;

/**
 * <p>
 * 基础标准-字典代码表 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-03
 */
@Validated
public interface DapStandardModifyService {

    /**
     * 写入
     *
     * @param basicStandardAndDicVo 基础标准和字典
     * @return Optional<String>
     */
    Optional<String> saveStandardBasicAndDic(@NotNull(message = "方法参数不可为空") BasicStandardAndDicVo basicStandardAndDicVo);

    /**
     * 保存基础标准及其字典信息，同时生成审批流程
     * 返回标准id
     */
    String saveStandardBasicAndDicAndAudit(BasicStandardAndDicVo basicStandardAndDicVo);

    /**
     * 写入标准并启动流程
     */
    String saveStandardBasicAndDicAndAudit(BasicStandardAndDicVo basicStandardAndDicVo, StandardAuditStatus auditStatus);

    /**
     * 判断当前标准是否都处于已发布状态
     *
     * @param std 标准抽象类
     * @return true 都处于已发布
     */
    boolean auditIsAllPublished(BasePublishInfoOfStandard<?> std);

    /**
     * 根据标准id获取基础标准和字典代码
     */
    BasicStandardAndDicVo getBasicStandardAndDicVo(@NotNull(message = "基础标准id不可空") String standardId);

    /**
     * 编辑基础标准数据和字典代码
     *
     * @param basicStandardAndDicVo 基础标准数据和字典代码
     * @param standardId            标准id
     */
    String editBasicStandardAndDicAndAudit(BasicStandardAndDicVo basicStandardAndDicVo, String standardId);

    /**
     * @param standardListSearchVo 查询条件 非空
     */
    IPage<StandardDataModifyVo> modifyList(@NotNull(message = "查询条件不可为空") StandardListSearchVo<?> standardListSearchVo);

    /**
     * 根据流程id {@link DapStandardAuditVersionMain#getId()}
     * <p>
     * 发起审批
     * 状态调整为待审批
     */
    void startAudit(@NotNull(message = "需要发起审批的标识不可为空") String... processId);

    /**
     * 编辑标准同时调整审批流程信息（变更状态：新增->编辑 etc.）
     */
    String editIndexStandardAndAudit(DapStandardIndex dapStandardIndex, @NotNull(message = "指标标准id不可为空") String standardIndexId);

    /**
     * 新增指标标准和启动流程
     * 返回标准id
     */
    String saveStandardIndexAndAudit(DapStandardIndex dapStandardIndex);

    /**
     * 新增指标标准和启动流程
     * 可指定标准的审批状态
     * 返回标准id
     */
    String saveStandardIndexAndAudit(DapStandardIndex dapStandardIndex, StandardAuditStatus auditStatus);

    /**
     * 流程id来
     * 撤销流程（待审批->不通过）
     *
     * @since v1.1 2020年9月9日09:53:35
     * 经过昨天会议，明确了撤销动作不是针对待审批状态数据进行撤销，而是对草稿状态的数据进行撤销
     * （可以理解为把流程中的新版本进行删除）
     */
    void revertAudit(@NotNull(message = "流程id不可为空") String auditId);

    /**
     * 文件上传
     */
    ResultBean<?> fileImport(InputStream inputStream,
                             @NotNull(message = "不可为空") MultipartFile file,
                             @NotNull(message = "标准类型不可为空") Integer standardType);

    /**
     * 根据文件进行导入并生成相应流程
     */
    ResultBean<?> importIndexStandardExcel(@NotNull(message = "文件路径不可为空") String filePath);

    /**
     * 根据文件进行导入基础标准并生成相应流程
     */
    ResultBean<?> importBasicStandardExcel(@NotNull(message = "文件路径不可为空") String filePath);

    /**
     * 文件导入根据路径和标准分类
     * 变更内容：{@link DapConstant.VersionMark#STANDARD_EXCEL_IMPORT}
     */
    ResultBean<?> fileImport(@NotNull(message = "文件路径不可为空") String filePath, @NotNull(message = "标准类型不可为空") Integer standardType);

    /**
     * 根据配置{@link BmDapConfig#getFile()}进行保存文件
     * 变更内容：{@link DapConstant.VersionMark#STANDARD_EXCEL_IMPORT}
     */
    Optional<String> storeUploadFile(MultipartFile file, String originalFilename);


    /**
     * 删除操作需要进行审批流程
     * <p>
     *
     * @since 2020年10月12日19:43:13 删除功能调整（期初理解为直接进行对标准删除，而今天落地确认为
     * <em>删除标准的业务逻辑是：启动一个删除的流程审批数据
     * （即变更类型为{@link DapStandardAuditVersionMain#getModifyType()} == 3以及变更状态为{@link StandardAuditStatus#草稿}的流程数据）</em>
     * 而最终是否删除标准，取决于是否通过待审批，若待审批通过则对{@link DapStandardAuditVersionMain#getModifyType()} == 3进行删除整个标准的流程数据和引用关系
     * 注意：其中{@link DapStandardAuditVersionMain#getModifyType()} == 3的流程数据是不可编辑的、
     * 并且要确保{@link DapStandardAuditVersionMain#getModifyType()} 一直为3（删除）来确保通过审批进行删除
     */
    void deleteAudit(String stdId, int standardType);

    /**
     * @param vo 标准抽象
     * @return true 为存在变更中 数据，f 不存在
     */
    @SuppressWarnings("rawtypes")
    boolean analyseAuditChanging(BasePublishInfoOfStandard vo);

    /**
     * @param inputStream  文件流
     * @param file         文件
     * @param standardType 标准类型
     * @param bizLineId    业务线id，用来导入到所属的业务线下
     */
    ResultBean<?> fileImportV2(InputStream inputStream, MultipartFile file,
                               Integer standardType, Integer bizLineId,
                               UserInfoHolder.UserInfo userInfo);
}
